package de.projectgoodmorning.alarm.storage;

import android.content.Context;
import android.util.Log;

import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;

/**
 * Der Db4oHelper ermoeglicht einen einfachen Zugriff auf abgelegte Datenbanken.
 * 
 * Die DB4o Datenbank ist eine Objekt-Datenbank, welche fuer die Android Plattform
 * zur freien Verwendung bereit gestellt wird.
 */
public class Db4oHelper {
	private static final String TAG = Db4oHelper.class.getName();

	private static ObjectContainer oc = null;
	private Context context;
	private String filename;
	
	/**
	 * Erstellt ein neues Db4oHelper-Objekt
	 * Sollte keine Datei anhand der uebergebenen Daten gefunden werden,
	 * wird eine neue Datenbank angelegt.
	 * Dies erfolgt erst durch den Aufruf von @see Db4oHelper#db()
	 * 
	 * @param context		erwartet einen Context, 
	 * 						fuer den Zugriff auf den interen Speicher
	 * @param filename		erwartet einen Dateinamen der Datenbank
	 */
	public Db4oHelper( Context context, String filename ) {
		this.context = context;
		this.filename = filename;
	}

	/**
	 * gibt den Zugriffs-Container der Datenbank zurueck.
	 * Mit diesem Objekt erhaelt man direkten Zugriff auf die Datenbank.
	 * 
	 * Gegebenenfalls wird jetzt eine Datenbank-Datei erstellt, wenn die
	 * im Konstruktor angegebene Datei nicht gefunden wurde.
	 */
	public ObjectContainer db() {
		try {
			if( oc == null || oc.ext().isClosed() ) {
				oc = Db4oEmbedded.openFile( db4oDBFullPath( context ) );
				Log.d( TAG, "database connection opened" );
			}
			return oc;
		} catch( Exception e ) {
			Log.e( TAG, e.toString() );
		}
		return null;
	}

	private String db4oDBFullPath( Context ctx ) {
		return ctx.getDir( "data", Context.MODE_PRIVATE ) + "/" + filename;
	}

	/**
	 * schliesst die gegebenenfalls geoeffnete Datenbank 
	 */
	public void close() {
		if( oc != null ) {
			oc.close();
			Log.d( TAG, "database connection closed" );
		}
	}
}
